package com.tencent.iov.cowin.befsale.clue.service.clue;

import com.tencent.iov.cowin.befsale.clue.controller.clue.vo.request.ClueFollowUpRequest;
import com.tencent.iov.cowin.befsale.clue.controller.clue.vo.request.UpdateClueIntentionRequest;
import com.tencent.iov.cowin.befsale.clue.controller.clue.vo.response.ClueIntentionGradeResponse;
import com.tencent.iov.cowin.befsale.clue.controller.clue.vo.response.ClueTaskDataResponse;
import com.tencent.iov.cowin.befsale.clue.controller.cus.vo.request.ClueIntentionGradeDataRequest;
import com.tencent.iov.cowin.befsale.clue.dao.kafka.response.ScrmLead;
import com.tencent.iov.cowin.befsale.clue.domain.clue.po.Clue;
import com.tencent.iov.cowin.befsale.clue.domain.clue.po.ClueInitial;
import com.tencent.iov.cowin.befsale.clue.value.enums.ClueErrorEnum;
import com.software.boot.common.model.dao.PageRequest;
import com.software.boot.common.model.dao.PageResponse;

import java.util.Date;
import java.util.List;

/**
 * @Describe: 线索信息表_Service接口层
 * @author: whp
 * @created: 2021-12-21 16:16:03
 * @version: 1.0
 */

public interface ClueService {

    /**
     * 通过ID获取详细信息
     *
     * @param: id
     * @return: Clue对象
     */
    Clue getDetailById(Long id);

    /**
     * 通过ID获取详细信息
     *
     * @param: externalUserId 外部联系人ID
     * @param followEmpId 跟进人ID
     * @return: Clue对象
     */
    Clue getDetailByExternalUserIdAndFollowEmpId(String externalUserId, Long followEmpId);

    /**
     * 单条数据插入Clue
     *
     * @param request
     * @return 插入的条数
     */
    int insert(Clue request);

    /**
     * 批量插入Clue
     *
     * @param requests
     * @return 批量插入的条数
     */
    int insertBatch(List<Clue> requests);

    /**
     * 单条Clue更新
     *
     * @param request
     * @return 更新的条数
     */
    int update(Clue request);

    /**
     * 单条Clue更新
     *
     * @param request
     * @return 更新的条数
     */
    int updateByIds(Clue request);

    /**
     * 通过ID删除数据
     *
     * @param request
     * @return 删除的条数
     */
    int delete(Clue request);

    /**
     * 根据条件查询对象list列表
     *
     * @param request
     * @return 查询结果
     */
    List<Clue> getListByParam(Clue request);

    /**
     * 根据条件查询对象Page记录
     *
     * @param request
     * @return 查询结果
     */
    PageResponse<Clue> getPageByParam(PageRequest<Clue> request);

    /**
     * 线索下发
     * @param request
     * @return
     */
    Long createClueWithfollowUp(ClueFollowUpRequest request, Integer sendType);

    /**
     * 参数验证
     * @param request
     * @return
     */
    ClueErrorEnum checkClueFollowUp(ClueFollowUpRequest request);

    ClueErrorEnum cleanClueCheck( ClueInitial clueInitial);
    /**
     * 创建跟进待办任务
     * @param date 截止时间
     * @param empIds 代办所有人
     * @param content 代办内容
     * @param name 客户名
     * @param phone 客户手机号
     * @param clueId 线索id
     */
    void makeFollowTodoTask(Date date, List<Long> empIds, String content, String name, String phone, Long clueId,String tenantId,String corpId,String externalUserid);

    void makeTodoAssignClue(Date date, List<Long> empIds, String content, String name, String phone, Long clueId,String tenantId,String corpId,String externalUserid);


    /**
     * 更新线索与意向信息
     * @param request 参数
     * @return 是否更新成功
     */
    Boolean updateClueAndIntention(UpdateClueIntentionRequest request);

    /**
     * 根据参数查询线索信息
     * @param request 参数
     * @return 线索信息
     */
    Clue getOneByParam(Clue request);
    /**
     * 管理看板-线索看板
     * add by zly 2022-01-11
     * @param clueIntentionGradeDataRequest
     * @return
     */
    ClueIntentionGradeResponse getClueIntentionGradeData(ClueIntentionGradeDataRequest clueIntentionGradeDataRequest);

    ClueIntentionGradeDataRequest initStartTimeEndTime(ClueIntentionGradeDataRequest clueIntentionGradeDataRequest);
    /**
     * 管理看板-任务看板
     * add by zly 2022-01-13
     * @param clueIntentionGradeDataRequest
     * @return
     */
    ClueTaskDataResponse getClueTaskData(ClueIntentionGradeDataRequest clueIntentionGradeDataRequest);

    /**
     * 根据条件获取顾问新增线索数量
     * add by zly
     * 2022-01-15
     * @param clueDataRequest
     * @return
     */
    Long getEmpClueNumByTime(ClueIntentionGradeDataRequest clueDataRequest);
    /**
     * 根据条件获取顾问跟进下单线索
     * add by zly
     * 2022-01-16
     * @param clueDataRequest
     * @return
     */
    Long getEmpFollowOrderNum(ClueIntentionGradeDataRequest clueDataRequest);

    /**
     * 根据条件查询顾问对应线索数量
     * add by zly
     * 2022-01-16
     * @param clueDataRequest
     * @return
     */
    Long getEmpNumByClueStatus(ClueIntentionGradeDataRequest clueDataRequest);

    /**
     * 定时器执行-SCRM通过线索中心将线索下发给下游
     * scrm根据线索状态的规则配置，来定时捞历史跟进的线索数据，通过kafka发送给下游（包括scrm、会员积分、经纪人）
     * 其中scrm也来消费，然后通过接口的形式发送给crm(但是crm是外部系统，所以需要有一层scrm来消费，再调接口发送给crm)
     * 会员积分，经纪人是内部系统，scrm发送kafka，他们消费
     * add by zly
     * 2022-01-22
     * @return
     */
    void syncClueByMqToOther(String sysnTime);

    Integer initClueInitStatus(Integer leadStatus);

    /**
     * 根据 crm的状态转化成scrm的线索状态
     * @param leadStatus
     * @return
     */
    Integer initClueStatus(Integer leadStatus);
    /**
     * 根据从crm视图同步过来的线索状态修改线索信息
     * add by zly
     * 2022-01-29
     * @param lead
     */
    void sysnClueStatusFromMq(ScrmLead lead);
}